'''
可变参数：指的是参数个数上的可变
        1.是指我们在定义函数的时候，不确定要传递多少个参数，那么我们可以使用可变参数。
        2.可变参数有两种：1.元组参数（普通值可变参数） 2.字典参数（关键字可变参数）
        3.元组参数：在参数前面加上一个*，那么这个参数就是元组参数。
            3.1 注意：
                3.1.1 如果函数参数除了有可变参数，还有其他的必要参数，那么可变参数的位置没有强调必须在前边还是后边
                3.1.2 如果可变参数是在后边，那么就按照正常顺序赋值即可，如果可变参数在前边，那么就需要使用关键字参数的写法。
            3.2 可变参数其实就是参数个数上是可变的，可以是0个~任意多个！
        4.字典参数：在参数前面加上两个*，那么这个参数就是字典参数。
        5.元组参数和字典参数的区别：1.元组参数是一个元组，字典参数是一个字典。
        
        
'''
#1.可变参数：由于传递过来的参数是多个也可以是0个，所以他会被封装成元组供我们在函数内部使用

def sum(*args):
    print(type(args))
    print(args) #会被封装成元组(1, 2, 3, 4, 5)为什么是元组参数呢？因为元组内容不可变。
sum(1,2,3,4,5)

def sum2(*args):
    result = 0
    for i in args:
        result += i
    print(result) #15
sum2(1,2)
sum2(1,2,3,4,5)

def sum3(name,*args):#name写后边的话调用时要用关键字参数的写法。name=xxx
    print(f"欢迎{name}来到本系统！")
    result = 0
    for i in args:
        result += i
    print(result) 
sum3("张三",1,2,3,4,5) #欢迎张三来到本系统！15
#sum3(name="李四",1,2,3,4,5) #TypeError: sum3() takes 1 positional argument but 6 were given
sum3("李四",1,2) #欢迎李四来到本系统！15
#不能直接把元组往里传，需要拆包。
tuple1 = (1,2,3,4,5)
sum3("李四",*tuple1) #欢迎李四来到本系统！15
'''
字典参数：
    1.字典参数的定义：在参数前面加上两个*，那么这个参数就是字典参数。
'''
'''
dict1 = {"name":"张三","age":18,"address":"北京"}
dict.get("name") #张三
dict["name"]#张三
'''
def say_hello(**kwargs): #kwargs是字典参数的名字，也可以是其他的名字。
    if len(kwargs) == 0: #判断字典参数是否为空，如果为空，那么就不打印。
        #print("欢迎来到本系统！")
        #return
        raise ValueError("参数不能为空！")#抛出异常，程序终止。
    print(f"{kwargs['age']}岁的{kwargs.get('name')},早上好！")
    print(type(kwargs)) #<class 'dict'>
    print(kwargs) #{'name': '张三', 'age': 18, 'address': '北京'}
#2.调用函数
#say_hello('张三',18,'北京') #TypeError: say_hello() takes 0 positional arguments but 3 were given
say_hello(name='张三',age=18) #{'name': '张三', 'age': 18, 'address': '北京'}
say_hello()#抛出异常，程序终止。

#不能直接把字典往里传，需要拆包。
dict1 = {"name":"张三","age":18,"address":"北京"}
say_hello(**dict1) #18岁的张三,早上好！
say_hello(**{"name":"张三","age":18,"address":"北京"}) #18岁的张三,早上好！